interface CameraOptions {
    center?: [number, number]; // 经度、纬度
    zoom?: number;             // 缩放级别
    bearing?: number;          // 旋转角度 (0 - 360)
    pitch?: number;            // 倾斜角度 (0 - 60)
}

const cameraManager = {
    /**
    * 设置相机的各种属性：中心、缩放、旋转、倾斜
    * @param options 相机设置选项
    */
    setCamera(map: any, options: CameraOptions): void {
        if (options.center) {
            map.setCenter(options.center);
        }
        if (options.zoom !== undefined) {
            map.setZoom(options.zoom);
        }
        if (options.bearing !== undefined) {
            map.setBearing(options.bearing);
        }
        if (options.pitch !== undefined) {
            map.setPitch(options.pitch);
        }
    },
    /**
     * 获取当前相机的所有状态
     * @returns 返回相机当前的中心点、缩放、旋转、倾斜
     */
    getCamera(map: any): CameraOptions {
        return {
            center: map.getCenter().toArray() as [number, number],
            zoom: map.getZoom(),
            bearing: map.getBearing(),
            pitch: map.getPitch(),
        };
    },
    /**
     * 平移地图（中心点变化）
     * @paramCenter 平移的经纬度偏移量
     */
    panByCenter(map: any, offset: [number, number]): void {
        map.panByCenter(offset);

    },
    /**
     * 缩放地图（增加或减少缩放级别）
     * @param zoomChange 缩放级别的偏移量
     */
    zoomBy(map: any, zoomChange: number): void {
        map.zoomBy(zoomChange);
    },
    /**
     * 设置地图的缩放级别
     * @param zoom 缩放级别
     */
    setZoom(map: any, zoom: number): void {
        map.setZoom(zoom);
    },
    /**
     * 设置地图的旋转角度
     * @param bearing 旋转角度
     */
    setBearing(map: any, bearing: number): void {
        map.setBearing(bearing);
    },
    /**
     * 设置地图的倾斜角度
     * @param pitch 倾斜角度
     */
    setPitch(map: any, pitch: number): void {
        map.setPitch(pitch);
    },
    /**
  * 跳转到指定的中心点
  * @param center 指定的经纬度位置
  */
    flyToCenter(map: any, center: any, options?: mapboxgl.FlyToOptions): void {
        map.flyTo({
            center,
            zoom: options?.zoom ?? map.getZoom(),
            bearing: options?.bearing ?? map.getBearing(),
            pitch: options?.pitch ?? map.getPitch(),
            essential: true,
            ...options,
        });
    },
    /**
 * 跳转到指定的视角（包括中心点、缩放、旋转、倾斜）
 * @param options 指定的视角设置
 */
    flyToView(map: any, options: CameraOptions & mapboxgl.FlyToOptions): void {
        map.flyTo({
            center: options.center,
            zoom: options.zoom,
            bearing: options.bearing,
            pitch: options.pitch,
            ...options,
        });
    },

    /**
     * 重置地图到默认视角
     */
    resetCamera(map: any): void {
        
        cameraManager.setCamera(map, {
            center: [0, 0], // 可以设置为默认值（例如 [0, 0]）
            zoom: 2,        // 默认缩放级别
            bearing: 0,     // 默认旋转角度
            pitch: 0,       // 默认倾斜角度
        });
    }


}

export { cameraManager }